/**
 * 面试题65：不用加减乘除做加法
 */
public class Offer_65 {
    /**
     * 位运算
     * <p>
     * 关于负数
     * 
     * 计算机中数值都以「补码」表示，补码可以将加减法统一处理
     */
    public int add(int a, int b) {
        // 当进位为 0 时结束循环
        while (b != 0) {
            // 计算进位，「进位」和「与运算」规律相同，需要左移一位
            int carry = (a & b) << 1;
            // 「无进位和」与「异或运算」规律相同
            a = a ^ b;
            b = carry;
        }
        return a;
    }
}
